#include "Administrador.h"

Administrador::Administrador(long numeroEstacionamiento, double precioPorHora) {
	this->precioPorHora = precioPorHora;

	std::string string = "./tmp/AutoSem" + to_string(numeroEstacionamiento);
	const char* cantidadAutosSem = string.c_str();
	//Para crear el archivo si no existe
	int fd = open(cantidadAutosSem, O_CREAT | O_WRONLY, 0777);
	close(fd);
	this->cantidadAutosSem = new Semaforo((char*) cantidadAutosSem, 1, 'A');

	string = "./tmp/AutosMem" + to_string(numeroEstacionamiento);
	const char* cantidadAutosMem = string.c_str();
	//Para crear el archivo si no existe
	fd = open(cantidadAutosMem, O_CREAT | O_WRONLY, 0777);
	close(fd);
	this->cantidadAutos.crear((char*) cantidadAutosMem, 'A');
	this->cantidadAutos.escribir(0);

	string = "./tmp/DineroSem" + to_string(numeroEstacionamiento);
	const char* dineroRecaudadaSem = string.c_str();
	//Para crear el archivo si no existe
	fd = open(dineroRecaudadaSem, O_CREAT | O_WRONLY, 0777);
	close(fd);
	this->dineroRecaudadaSem = new Semaforo((char*) dineroRecaudadaSem, 1, 'A');

	string = "./tmp/DineroMem" + to_string(numeroEstacionamiento);
	const char* dineroRecaudadoMem = string.c_str();
	//Para crear el archivo si no existe
	fd = open(dineroRecaudadoMem, O_CREAT | O_WRONLY, 0777);
	close(fd);
	this->dineroRecaudada.crear((char*) dineroRecaudadoMem, 'A');
	this->dineroRecaudada.escribir(0.0);

}

double Administrador::consultarDineroRecaudado() {
	this->dineroRecaudadaSem->p();
	double dinero = *this->dineroRecaudada.leer();
	this->dineroRecaudadaSem->v();
	return dinero;
}

int Administrador::consultarCantidadAutos() {
	this->cantidadAutosSem->p();
	int cantidad = *this->cantidadAutos.leer();
	this->cantidadAutosSem->v();
	return cantidad;
}

void Administrador::sacarAuto(Auto * autoSaliendo) {
	this->operarSobreCantidadAutos(-1);
	this->sumarDinero(this->precioPorHora * autoSaliendo->getCantHoras());
}

void Administrador::sacarAuto(int tiempoEnEstacionamiento) {
	this->operarSobreCantidadAutos(-1);
	this->sumarDinero(this->precioPorHora * tiempoEnEstacionamiento);
}

void Administrador::entraAuto() {
	this->operarSobreCantidadAutos(1);
}

void Administrador::operarSobreCantidadAutos(int valor) {
	this->cantidadAutosSem->v();
	int cantidad = *this->cantidadAutos.leer() + valor;
	this->cantidadAutos.escribir(cantidad);
	this->cantidadAutosSem->p();
}

void Administrador::sumarDinero(double valor) {
	this->dineroRecaudadaSem->p();
	double dinero = *this->dineroRecaudada.leer() + valor;
	this->dineroRecaudada.escribir(dinero);
	this->dineroRecaudadaSem->v();
}

void Administrador::liberarMemoria() {
	this->cantidadAutos.liberar();
	this->dineroRecaudada.liberar();
}

void Administrador::terminar() {
	this->cantidadAutosSem->eliminar();
	this->dineroRecaudadaSem->eliminar();
}

Administrador::~Administrador() {

}

